package cn.edu.lsu.integratedsurvey.controller;

import cn.edu.lsu.integratedsurvey.bean.dto.DataEntryDto;
import cn.edu.lsu.integratedsurvey.bean.dto.GetHistoryDto;
import cn.edu.lsu.integratedsurvey.bean.vo.HistoryInfoVo;
import cn.edu.lsu.integratedsurvey.service.HistoryService;
import cn.edu.lsu.integratedsurvey.tool.JwtUtil;
import cn.edu.lsu.integratedsurvey.tool.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.jsonwebtoken.Claims;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 综测历史记录
 *
 * @author Jasmine-drs
 * @date 2024/5/1 16:52
 */

@Slf4j
@Api("综测模块")
@RestController
@RequestMapping("/histories")
public class HistoryController {

	private final HistoryService historyService;

	final JwtUtil jwtUtil;//    jwt鉴权的工具类，判断是否是管理员（admin）或者root

	public HistoryController(HistoryService historyService, JwtUtil jwtUtil) {
		this.historyService = historyService;
		this.jwtUtil = jwtUtil;
	}

	/**
	 * 增加学生综测，需要有管理员权限
	 *
	 * @param dataEntryDto 学生综测信息
	 * @param authHeader   jwt
	 * @return 录入结果
	 */
	@PostMapping("/update")
	@ApiOperation("单次录入综测记录")
	public R<String> updateStudent(@RequestBody DataEntryDto dataEntryDto, @RequestHeader("Authorization") String authHeader) {
		if (log.isDebugEnabled()) {
			log.debug("dataEntryDto:{}", dataEntryDto);
			log.debug("authHeader:{}", authHeader);
		}
//		提取头部的jwt信息，进行鉴权
		if (jwtUtil.isAdmin(authHeader)) {
			Map<String, Object> token = jwtUtil.parseToken(authHeader);
			Claims claims = (Claims) token.get("claims");
			Integer operatorId = claims.get("id", Integer.class);
			dataEntryDto.setOperatorId(String.valueOf(operatorId));
//		调用录入学生综测方法
			historyService.updateStudent(dataEntryDto);
			return R.success("修改成功");
		}
		return R.err("权限不足");
	}


	/**
	 * 批量录入学生综测信息
	 *
	 * @param dataEntryDtoList 学生综测列表
	 * @param authHeader       jwt
	 * @return 录入结果
	 */
	@PostMapping("/update/batch")
	@ApiOperation("批量录入学生综测信息")
	public R<String> batchUpdateStudent(@RequestBody List<DataEntryDto> dataEntryDtoList, @RequestHeader("Authorization") String authHeader) {
		if (log.isDebugEnabled()) {
			log.debug("dataEntryDtoList:{}", dataEntryDtoList);
			log.debug("authHeader:{}", authHeader);
		}
//		提取头部的jwt信息，进行鉴权
		if (jwtUtil.isAdmin(authHeader)) {
			Map<String, Object> token = jwtUtil.parseToken(authHeader);
			Claims claims = (Claims) token.get("claims");
			Integer operatorId = claims.get("id", Integer.class);
			dataEntryDtoList.forEach(dataEntryDto -> dataEntryDto.setOperatorId(String.valueOf(operatorId)));
//		调用批量录入学生综测方法
			historyService.batchUpdateStudent(dataEntryDtoList);
			return R.success("录入成功");
		}
		return R.err("权限不足");
	}

//	/**
//	 * 删除综测记录，需要管理员权限
//	 *
//	 * @param id         需要删除记录的id
//	 * @param authHeader jwt
//	 * @return 删除结果
//	 */
//	@DeleteMapping("/delete/{id}")
//	@ApiOperation("删除综测记录")
//	public R<String> deleteHistory(@PathVariable Integer id, @RequestHeader("Authorization") String authHeader) {
//		if (log.isDebugEnabled()) {
//			log.debug("id:{}", id);
//			log.debug("authHeader:{}", authHeader);
//		}
////		提取头部的jwt信息，进行鉴权
//
////		调用删除综测记录方法
//
//		return R.success("删除成功");
//	}
//
//	/**
//	 * 修改记录,管理员权限
//	 *
//	 * @param dataUpdateDto 修改信息
//	 * @param authHeader    jwt
//	 * @return 修改结果
//	 */
//	@PutMapping("/update")
//	@ApiOperation("修改综测记录")
//	public R<String> updateHistory(@RequestBody DataUpdateDto dataUpdateDto, @RequestHeader("Authorization") String authHeader) {
//		if (log.isDebugEnabled()) {
//			log.debug("dataEntryDto:{}", dataUpdateDto);
//			log.debug("authHeader:{}", authHeader);
//		}
////		提取头部的jwt信息，进行鉴权
//
////		调用修改综测记录方法
//		return R.success("修改成功");
//	}

	/**
	 * 根据学号和类型获取学生综测记录
	 * <p>学号不能为空，type可以为空</p>
	 *
	 * @param getHistoryDto 查询体
	 * @return 综测历史记录分页对象
	 */
	@PostMapping("/get")
	@ApiOperation("获取学生综测记录")
	public R<Page<HistoryInfoVo>> getHistories(@RequestBody GetHistoryDto getHistoryDto) {
		if (log.isDebugEnabled()) {
			log.debug("studentNumber:{}", getHistoryDto.getStudentNumber());
		}
//		调用根据学号和类型获取学生综测记录方法
		Page<HistoryInfoVo> histories = historyService.getHistories(getHistoryDto);
		return R.success(histories);
	}
}
